﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using DevComponents.DotNetBar;
using AppManagement.Repositories;
using AppManagement.Helpers;
using AppManagement.Models;

namespace AppManagement.MainManagers
{
    public partial class FrmLapPhieuDangKyHocPhan : DevComponents.DotNetBar.Office2007Form
    {
        public EventHandler Handler { get; set; }
        private DataTable DataSource;
        private int MaKhoa;
        private int MaCN;
        private int MaKHDT;
        private int MaPhieuDangKy;

        public FrmLapPhieuDangKyHocPhan(int makhoa, int macn, int makhdt, int maphieudangky = -1)
        {
            InitializeComponent();
            InitGridView();
            this.MaKhoa = makhoa;
            this.MaCN = macn;
            this.MaKHDT = makhdt;
            this.MaPhieuDangKy = maphieudangky;
            InitData();
            InitPhieuDangKy();
        }

        public void InitPhieuDangKy()
        {
            if (this.MaPhieuDangKy == -1)
            {
                return;
            }
            var phieudangky = PhieuDangKyRepository.SelectByID(this.MaPhieuDangKy);
            txtMSSV.Text = phieudangky.MSSV;
            var lstchitiet = ChiTietDangKyRepository.SelectByMaPhieuDK(phieudangky.MaPhieuDK);

            foreach (DataGridViewRow row in dtgvData.Rows)
            {
                foreach (var chitiet in lstchitiet)
                {
                    if (int.Parse(row.Cells["MaCTKHDT"].Value.ToString()) == chitiet.MaCTKHDT)
                    {
                        row.Cells["DangKy"].Value = true;
                        break;
                    }
                }
            }
        }

        public void InitData()
        {
            var khoa = KhoaRepository.SelectByID(this.MaKhoa);
            var chuyennganh = ChuyenNganhRepository.SelectByID(this.MaCN);
            var khdt = KeHoachDaoTaoRepository.SelectByID(this.MaKHDT);
            txtKhoa.Text = khoa.TenKhoa;
            txtChuyenNganh.Text = chuyennganh.TenCN;
            txtKHDT.Text = khdt.TenGoi;

            var lstCTKHDT = ChiTietKHDTRepository.SelectByMaKHDT(khdt.MaKHDT);

            InitDataSource();

            foreach (var item in lstCTKHDT)
            {
                DataSource.Rows.Add(item.MaCTKHDT, item.MaHP, item.HocPhan.TenHP, false);
            }
        }
        private void btnExit_Click(object sender, EventArgs e)
        {
            Close();
        }

        private void btnSelect_Click(object sender, EventArgs e)
        {
            var sinhvien = SinhVienRepository.SelectByID(txtMSSV.Text);
            if (sinhvien == null)
            {
                MessageBoxEx.Show("Không có sinh viên nào ứng với MSSV đã nhập", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }

            var lstHocPhan = new List<ChiTietKHDT>();
            foreach (DataGridViewRow row in dtgvData.Rows)
            {
                bool val;
                if (bool.TryParse(row.Cells["DangKy"].Value.ToString(), out val))
                {
                    if (val)
                    {
                        var ctkhdt = ChiTietKHDTRepository.SelectByID(int.Parse(row.Cells["MaCTKHDT"].Value.ToString()));
                        lstHocPhan.Add(ctkhdt);
                    }
                }
            }
            if (this.MaPhieuDangKy == -1)
            {
                if (lstHocPhan.Count > 0)
                {
                    var phieudangky = new PhieuDangKy
                    {
                        MSSV = txtMSSV.Text.Trim(),
                        MaKHDT = this.MaKHDT,
                        NgayDangKy = DateTime.Now
                    };
                    var result = PhieuDangKyRepository.Insert(phieudangky);
                    if (result)
                    {
                        foreach (var item in lstHocPhan)
                        {
                            var ctdk = new ChiTietDangKy
                            {
                                MaPhieuDK = phieudangky.MaPhieuDK,
                                MaCTKHDT = item.MaCTKHDT
                            };
                            ChiTietDangKyRepository.Insert(ctdk);
                        }
                        MessageBoxEx.Show("Đăng ký học phần thành công", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    }
                    else
                    {
                        MessageBoxEx.Show("Đăng ký học phần thất bại", "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    }
                }
            }
            else// Cap nhat phieu dang ky
            {
                var phieudangky = PhieuDangKyRepository.SelectByID(this.MaPhieuDangKy);
                var lstChiTietDangKy = ChiTietDangKyRepository.SelectByMaPhieuDK(phieudangky.MaPhieuDK);
               
                // Tim nhung phan tu se bi remove khoi danh sach dang ky
                var lstElemsWillBeRemoved = new List<int>();
                foreach (var item in lstChiTietDangKy)
                {
                    var exist = false;
                    foreach (var item2 in lstHocPhan)
                    {
                        if (item.MaCTKHDT == item2.MaCTKHDT)
                        {
                            exist = true;
                            break;
                        }
                    }
                    if (!exist)
                    {
                        lstElemsWillBeRemoved.Add(item.MaCTDK);
                    }
                }

                // Tim nhung phan tu se duoc them vao danh sach dang ky
                var lstElemsWillBeAdded = new List<ChiTietKHDT>();
                foreach (var item in lstHocPhan)
                {
                    var exist = false;
                    foreach (var item2 in lstChiTietDangKy)
                    {
                        if (item.MaCTKHDT == item2.MaCTKHDT)
                        {
                            exist = true;
                            break;
                        }
                    }
                    if (!exist)
                    {
                        lstElemsWillBeAdded.Add(item);
                    }
                }

                // Xoa nhung chi tiet dang ky khong co trong danh sach cap nhat
                foreach (var item in lstElemsWillBeRemoved)
                {
                    ChiTietDangKyRepository.Delete(item);
                }

                // Xoa nhung chi tiet dang ky co trong danh sach cap nhat
                foreach (var item in lstElemsWillBeAdded)
                {
                    var ctdk = new ChiTietDangKy
                    {
                        MaPhieuDK = phieudangky.MaPhieuDK,
                        MaCTKHDT = item.MaCTKHDT
                    };
                    ChiTietDangKyRepository.Insert(ctdk);
                }
                MessageBoxEx.Show("Đăng ký học phần thành công", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
        }

        private void InitGridView()
        {
            DataGridViewTextBoxColumn objColumn = new DataGridViewTextBoxColumn
            {
                HeaderText = "MaCTKHDT",
                DataPropertyName = "MaCTKHDT",
                Name = "MaCTKHDT",
                Width = (int)((dtgvData.Width - dtgvData.RowHeadersWidth) * ((double)1 / 4)) - 30
            };
            dtgvData.Columns.Add(objColumn);

            objColumn = new DataGridViewTextBoxColumn
            {
                HeaderText = "MaHP",
                DataPropertyName = "MaHP",
                Name = "MaHP",
                Width = (int)((dtgvData.Width - dtgvData.RowHeadersWidth) * ((double)1 / 4)) - 30
            };
            dtgvData.Columns.Add(objColumn);

            objColumn = new DataGridViewTextBoxColumn
            {
                HeaderText = "TenHP",
                DataPropertyName = "TenHP",
                Name = "TenHP",
                Width = (int)((dtgvData.Width - dtgvData.RowHeadersWidth) * ((double)1 / 4)) + 80
            };
            dtgvData.Columns.Add(objColumn);

            DataGridViewCheckBoxColumn objCkbxColumn = new DataGridViewCheckBoxColumn
            {
                HeaderText = "DangKy",
                DataPropertyName = "DangKy",
                Name = "DangKy",
                Width = (int)((dtgvData.Width - dtgvData.RowHeadersWidth) * ((double)1 / 4)) - 2 - 20
            };
            objCkbxColumn.HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleCenter;
            dtgvData.Columns.Add(objCkbxColumn);
        }

        public void InitDataSource()
        {
            DataSource = new DataTable();
            DataSource.Columns.Add("MaCTKHDT");
            DataSource.Columns.Add("MaHP");
            DataSource.Columns.Add("TenHP");
            DataSource.Columns.Add("DangKy");
            DataView objTimeSheetDV = new System.Data.DataView(DataSource);
            objTimeSheetDV.AllowNew = false;
            dtgvData.AutoGenerateColumns = false;
            dtgvData.DataSource = objTimeSheetDV;
            dtgvData.ClearSelection();
        }

        private void FrmLapPhieuDangKyHocPhan_FormClosed(object sender, FormClosedEventArgs e)
        {
            this.Handler(sender, e);
        }
    }
}